#include<bits/stdc++.h>
#define maxn 100000+5
#define inf 0x3f3f3f3f
using namespace std;
int maxv[maxn*20];
long long read() {
	long long x;
	scanf("%lld",&x);
	return x;
}
long long IN() {
	long long a=0;
	char ch;
	while((ch=getchar())!=' '&&ch!='\n') {
		a*=10;
		a+=ch-'0';
	}
	return a;
}
//struct Edge{
//
//}tree;
int s[maxn];
int qry(int o,int L,int R,int l,int r) {
	int ans=-inf;
	int mid=(L+R)>>1;
	if(l<=L&&r>=R) return maxv[o];
	if(mid>=l) ans=max(ans,qry(o*2,L,mid,l,r));
	if(mid<r) ans=max(ans,qry(o*2+1,mid+1,R,l,r));
	return ans;
}
void upd(int o,int L,int R,int x,int y) {
	s[x]=y;
	int mid=(L+R)/2;
	if(L==R)maxv[o]=y;
	else {
		if(x<=mid)upd(o*2,L,mid,x,y);
		else upd(o*2+1,mid+1,R,x,y);
		maxv[o]=max(maxv[o*2],maxv[o*2+1]);
	}
}
void build(int o,int L,int R) {
	int mid=(L+R)/2;
	if(L==R) maxv[o]=s[L];
	else {
		build(o*2,L,mid);
		build(o*2+1,mid+1,R);
		maxv[o]=max(maxv[o*2],maxv[o*2+1]);
	}
}
int main() {
	long long n=read(),m=read();
	for(int i=1; i<=maxn; i++) maxv[i]=inf;
	memset(s,0,sizeof(s));
	for(int i=1; i<=n; i++) s[i]=read();
	build(1,1,n);
	while(m--) {
		int k=read(),x=read(),y=read();
		if(k==1)upd(1,1,n,x,s[x]+y);
		else printf("%d\n",qry(1,1,n,x,y));
	}
}